package es.us.mwm.backBean;

import es.us.mwm.entities.Alerts;
import es.us.mwm.entities.Historyalerts;
import es.us.mwm.entities.Users;
import es.us.mwm.sessionBean.AlertsFacade;
import es.us.mwm.sessionBean.HistoryAlertsFacade;
import java.io.Serializable;
import java.util.Collection;
import javax.ejb.EJB;
import javax.faces.context.FacesContext;
import javax.faces.view.ViewScoped;
import javax.inject.Named;
import javax.servlet.http.HttpSession;
import org.primefaces.push.PushContext;
import org.primefaces.push.PushContextFactory;

/**
 * Controlador para las alertas
 * @author y0rg
 */
@Named(value = "alertsController")
@ViewScoped
public class AlertsController extends AbstractController<Alerts> implements Serializable {

    @EJB
    private HistoryAlertsFacade historyAlertsFacade;
    @EJB
    private AlertsFacade alertFacade;

    private Collection<Alerts> items;

    /**
     * Constructor basico sin parametros
     */
    public AlertsController() {
        super(Alerts.class);
    }

    @Override
    public Collection<Alerts> getItems() {
        if (items == null) {
            items = this.alertFacade.findAll();
        }
        return items;
    }

    /**
     * Refresca la tabla de alertas consultando a la base de datos
     * @return Lista de elementos recuperados de la base de datos
     */
    @Override
    public Collection<Alerts> refresh() {
        items = this.alertFacade.findAll();
        return items;
    }

    /**
     * Procesa una alerta, la anade al historico una vez procesada
     * @param alert alerta a anadir al historico
     */
    public void process(Alerts alert) {
        Historyalerts halert = new Historyalerts();
        halert.setDate(alert.getDate());
        halert.setDescription(alert.getDescription());
        halert.setLatitude(alert.getLatitude());
        halert.setLongitude(alert.getLongitude());
        halert.setName(alert.getName());
        halert.setPhone(alert.getPhone());
        halert.setType(alert.getType());
        HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
        Users user = new Users();
        user.setUser((String) session.getAttribute("user"));
        halert.setUser(user);
        historyAlertsFacade.create(halert);
        
        //TODO - Posible mejora
        //Mensaje de vuelta al nº movil indicando que su alerta ha sido procesada
    }

    /**
     * Elimina la alerta procesada de la tabla de alertas (no procesadas)
     * @param alert la alerta que se va a eliminar
     */
    public void delete(Alerts alert) {
        alertFacade.remove(alert);
        //Mensaje push del servidor para actualizar la tabla alertas y que no hay concurrencia
        PushContext pushContext = PushContextFactory.getDefault().getPushContext();
        pushContext.push("/newAlert", "message");
    }

    /**
     * Devuelve la alerta que se iba a procesar pero no se ha procesado a la tabla de alertas
     * @param alert alerta que vuelve a la tabla
     */
    public void restore(Alerts alert) {
        alertFacade.create(alert);
        //Mensaje push del servidor para actualizar la tabla alertas y que no hay concurrencia
        PushContext pushContext = PushContextFactory.getDefault().getPushContext();
        pushContext.push("/newAlert", "message");
    }
}
